#include "stdafx.h"
#include "Plan.h"

Plan::Plan(): Objet(){}
Plan::Plan(Vecteur normale1, Point p1)
{
	normale1.normalize();
	p1.normalize();
	normale = normale1;
	p = p1;

	A = -normale.getX();
	B = -normale.getY();
	C = -normale.getZ();
	D = normale.getX()*p.getX()+normale.getY()*p.getY()+normale.getZ()*p.getZ();
}

Plan::Plan(Plan const& plan)
{
	normale = plan.normale;
	p = plan.p;
	A = plan.A;
	B = plan.B;
	C = plan.C;
	D = plan.D;
}

Plan::~Plan(){}

Plan& Plan::operator=(Plan const& plan)
{
	normale = plan.normale;
	p = plan.p;
	A = plan.A;
	B = plan.B;
	C = plan.C;
	D = plan.D;

	return *this;
}

bool Plan::intersection(Rayon r)
{
	// point = p0 +tu
	// normale * (point-p) = 0
	// normale * (p0+tu-p) = 0
	// normaleX*(p0X+tuX-pX) + normaleY*(p0Y+tuY-pY)+normaleZ*(p0Z+tuZ-pZ) = 0
	// (normaleX*uX + normaleY*uY+normaleZ*uZ)*t = normaleX*(pX-p0X) + normaleY*(pY-p0Y) + normaleZ*(pZ-p0Z)

	Point origine = r.getOrigine();
	Vecteur direction = r.getDirection();
	Vecteur v(p.getX()-origine.getX(), p.getY()-origine.getY(),  p.getZ()-origine.getZ());
	float produit1 = normale.produitScalaire(direction);

	if(produit1 > 0.0f)
	{
		produit1 = - produit1;
		normale.inverse();
		if(getTexture())
			setVertical(normale);
	}

	float produit2 = normale.produitScalaire(v);

	float t;
	Point interPoint;

	if(produit1)
	{
		t = produit2/produit1;
		if(t >0)
		{
			interPoint.setX(origine.getX() + t*direction.getX());
			interPoint.setY(origine.getY() + t*direction.getY());
			interPoint.setZ(origine.getZ() + t*direction.getZ());
			
			inter.setPoint(interPoint);
			inter.setT(t);
			inter.setNormale(normale);
			inter.setObjet(this);
			inter.setCouleur(couleur);

			return true;
		}
		else{
			// Il n'existe pas d'intersection
			return false;
		}
	}else if(produit2){
		// Il n'existe pas d'intersection
		return false;
	}
	else
	{
		// Il existe intersections infinis
		return false;
	}
}

BoiteEnglobante Plan::getBoite()
{
	BoiteEnglobante b;
    
	b.corner1.setX(MAXFLOAT);
	b.corner1.setY(MAXFLOAT);
	b.corner1.setZ(MAXFLOAT);

	b.corner2.setX(MINFLOAT);
	b.corner2.setY(MINFLOAT);
	b.corner2.setZ(MINFLOAT);	
    
	return b;
}

bool Plan::aBoite()
{
	return false;
}

